Python Tutorial

Eine minimale Einführung in Python für Studierende mit Programmiererfahrung die keinen Anspruch auf Vollständigkeit erhebt.

Ausführlichere Einführungen und Tutorials finden sich an zahlreichen Stellen im Internet. Beispielsweise

Installation

Um Jupyter (formals IPython) Notebooks interaktiv auf deinem Computer benutzen zu können, musst du zunächst ein paar Pakete installieren. Falls du Linux oder Mac OS benutzt und dich etwas auskennst, kannst du einfach deinen Paketmanager verwenden. Für diesen Kurs verwenden wir Python 3.5 mit den Paketen numpy, scipy und matplotlib. Zusätzlich installiere bitte das jupyter Paket um die interaktiven Notebooks nutzen zu können. Falls dir das zu viel Aufwand ist, gibt es den Anaconda Installer der alle nötigen Pakete mitbringt und auf allen gängigen Plattformen funktioniert. Eine ausführliche Anleitung dafür findet sich auf den Seiten des PeP et al. Toolbox Workshops.

Interaktives Notebook

Dieses interaktive Notebook enthält ausführbare Zellen. Um eine Zelle auszuführen, bringe sie in den Fokus (z.B. durch Anklicken) und drücke Strg+Enter.


In [1]:
print('Hello, world!')


Hello, world!

Variablen, Datentypen, Operatoren

Python hat ein dynamisches Typsystem, das bedeutet dass sich der Typ einer Variablen von Zuweisung zu Zuweisung ändern kann. Die eingebauten Typen von Python sind

  • Der nullwertige Typ NoneType und sein einziger Wert None
  • Den wahrheitswertigen Typen bool und seine Werte True und False
  • Numerische Typen
    • int z.B. 42
    • float z.B. 3.1415
    • complex z.B. 2+3j
  • Sequenzen
    • string z.B. 'Hallo, Welt!'
    • list z.B. [1, 2, 3]
    • tuple z.B. (1, 'a', 3.1415)
  • Den Abbildungstypen dict, z.B. {'name': 'Hans', 'alter': 42}
  • Den Mengentypen set, z.B. {1, 2, 3}

In [23]:
# Dies ist ein Kommentar :)

x = 1  # x ist ein int
print(x)

x = 'Hallo, Welt!'  # x ist jetzt ein string
print(x)

y = 3.1415  # y is ein float
print(y)

z = [1, 'a', 2.7182]  # z ist eine (heterogene) Liste mit drei Einträgen
                      # Auch wenn es vom Typsystem nicht gefordert wird,
                      # ist es eine gute Idee, Listen nur homogen zu befüllen.
z = [1, 2, 3]
print(z)
print(z[1])
print(z[0:-1]) # Mit Hilfe von "Slices" können wir Teile von Listen addressieren.
               # Die Syntax ist dabei {Anfang}:{Ende}:{Schrittweite} wobei negative
               # Indices vom Ende der Liste gezählt werden.

(a, b) = (100, 'Zaphod')  # Tuple können benutzt werden, um Ausdrücke zu entpacken
                        # und so effektiv mehrere Variablen gleichzeitig zuzuweisen
                        # Die Klammern können dabei weggelassen werden
a, b = 42, 'Ford'
print(a)
print(b)

x = 'Die Antwort ist {}.'.format(a)  # Strings lassen sich formatieren, so können die Inhalte
                                   # von Variablen bequem ausgegeben werden.
print(x)


1
Hallo, Welt!
3.1415
[1, 2, 3]
2
[1, 2]
42
Ford
Die Antwort ist 42.

Jeder dieser Typen lässt sich in einem wahrheitswertigen Kontext verwenden. In einem solchen ist beispielsweise ein leerer String oder eine leere Liste gleichbedeutend mit False.


In [3]:
not []


Out[3]:
True

Mit Hilfe von Operatoren lassen sich Typen verknüpfen. Für numerische Typen gibt es beispielsweise die arithmetischen Operatoren

  • + Addition
  • - Subtraktion
  • * Multiplikation
  • / Division
  • // ganzzahlige Division
  • % Restwertbildung
  • ** Potenzieren

In [4]:
a = 1.337
b = a * 5
c = b ** 10
c


Out[4]:
178243670.14837125

Eine vollständige Übersicht der Typen und verfügbaren Operationen findet sich in der offiziellen Dokumentation.

Konstrollstrukturen, Schleifen, Iteration

Auch in Python gibt es if-Verzweigungen und (selten benutzte) while-Schleifen


In [5]:
name = ''
if 5 == 3:
    print('Irgendwas stimmt mit dem Universum nicht.')
elif name:  # Hier wird die Wahrheitswertigkeit verwendet
    print('Hallo, {}!'.format(name))
else:  # Setze einen Namen ein, um nicht hier zu landen
    print('Nun, das ist jetzt etwas peinlich…')


Nun, das ist jetzt etwas peinlich…

In [6]:
i = 0
while i < 5:
    print(i)
    i += 1


0
1
2
3
4

Eine for-Schleife wie in C gibt es in Python nicht. Das for-Schlüsselwort kommt immer in Begleitung seines Freundes in; die beiden sind unzertrennlich. Damit lässt sich über Sequenzen iterieren.


In [7]:
names = ['Klaus', 'Dieter', 'Hans']
for name in names:
    print('Hello {}'.format(name))
    
for i in range(5):  # Praktisch, um Zahlenfolgen zu erzeugen.
    print(i)


Hello Klaus
Hello Dieter
Hello Hans
0
1
2
3
4

Das liest sich doch deutlich angenehmer als die while-Schleife, oder? Falls du mal explizit die Indices einer Sequenz brauchst, hilft die enumerate Funktion.


In [8]:
for index, name in enumerate(names):
    print('Person {} heißt {}.'.format(index, name))


Person 0 heißt Klaus.
Person 1 heißt Dieter.
Person 2 heißt Hans.

Funktionen

Mit print, range und enumerate haben wir bereits Beispiele für Funktionen und die Aufrufsyntax gesehen. Um eigenen Funktionen zu definieren verwenden wir das def Schlüsselwort. Außerdem geben wir der Funktion eine Beschreibung. Die Beschreibung ist zwar optional, kann aber immens zum Verständnis des Codes beitragen. Sie wird für die automatisch generierte Hilfe der Funktion verwendet. Sie sollte in Englisch sein um unseren Code portabel zu halten.


In [9]:
def square(x):
    """This function squares its input.
        x - A value of a type that implements `**` (power).
    """
    return x ** 2

print(square(4))


16

In [10]:
help(square)


Help on function square in module __main__:

square(x)
    This function squares its input.
    x - A value of a type that implements `**` (power).

Schau dir doch mal die Hilfe zu print an und finde heraus, wie wir verhindern können, dass nach jedem Aufruf von print eine neue Zeile begonnen wird. Passe dann die folgende Zelle so an, dass alle Zahlen durch Leerzeichen getrennt in der selben Zeile erscheinen.


In [11]:
for i in range(100):
    print(i)


0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

Funktionen können mehrere Argumente annehmen. Dabei wird zwischen Argumenten und Schlüsselwortargumenten unterschieden. Primitive Datentypen wie int können als Schlüsselwortargument vordefiniert werden, da sie "by value" übergeben werden. Komplexere Datentypen wie zum Beispiel Listen werden als Referenzen übergeben was zur Folge hat, dass ein Standardwert innerhalb der Funktion verändert werden könnte. Deswegen wird i.d.R. das Verfahren aus dem untenstehenden Beispiel verwendet.


In [12]:
greetings = {
    'English': 'Hello, {}!',
    'Deutsch': 'Hallo, {}!',
    'Francais': 'Salut, {}!',
    'Espagnol': '¡Hola, {}!'
}

def greet(name, language=None):
    if language is None:  # So wird ein Standardwert für Sequenztypen definiert
        language = 'English'
    greeting = greetings.get(language)
    if greeting is None:
        print("Well, this is embarassing. I don't speak {}.".format(language))
    else:
        print(greeting.format(name))
        
greet('William')
greet('Wilhelm', language='Deutsch')
greet('Guillaume', 'Francais')  # Wenn die Reihenfolge stimmt, kann das Schlüsselwort
                                # auch weggelassen werden.
greet('Guillermo', language='Espagnol')
greet('Guglielmo', language='Italiano')


Hello, William!
Hallo, Wilhelm!
Salut, Guillaume!
¡Hola, Guillermo!
Well, this is embarassing. I don't speak Italiano.

Comprehension

Listen, bzw. Sequenzen allgemein, aus Ausdrücken generieren zu können ist eines der stärksten Features von Python. Um zum Beispiel eine Liste der Quadrate aller Zahlen in einer anderen Liste zu berechnen benötigen wir nur eine einzige Zeile Code


In [13]:
[x ** 2 for x in range(10)]


Out[13]:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Auf die gleiche Art lassen sich auch Sequenzen filtern.


In [14]:
[x for x in range(10) if x % 2 != 0]


Out[14]:
[1, 3, 5, 7, 9]

Das Ganze lässt sich natürlich kombinieren und verschachteln.


In [15]:
odd_squares = [x ** 2 for x in range(10) if x % 2 == 1]
print(odd_squares)

nums = [z for z in [x + y for x in range(3) for y in range(3, 6)] if z < 6]
print(nums)


[1, 9, 25, 49, 81]
[3, 4, 5, 4, 5, 5]

Weiterführende Themen

werden hier nur kurz angeschnitten. Der geneigte Leser wird angehalten eine der eingangs erwähnten Resourcen zu konsultieren.

Eigene Typen / Klasen

Mit Hilfe des class-Schlüsselwortes lassen sich eigene Typen definieren. Typen haben Methoden und Attribute, wie man es aus objektorientierten Sprachen kennt. Alle Methoden einer Klasse nehmen als erstes Argument eine Referenz auf das aktuelle Objekt namens self an. Die geschulte C++-Programmiererin kann sich das als expliziten this Zeiger vorstellen.

Standardbibliothek

Python kommt "mit Batterien". Die Standardbibliothek bietet Funktionalität für eine ganze Bandbreite von Aufgaben bis hin zu einem Webserver. Es wird dringend empfohlen sich mit den folgenden Teilen vertraut zu machen: